sort や sorted は複数回利用することはできない
以下のような sort を行った。
let flavors = try await getFlavors()
.sorted(by: { $0.title < $1.title })
.sorted(by: { $0.categoryName < $1.categoryName })
.sorted(by: { $0.isPrimary && !$1.isPrimary })
このときの意図として
isPrimaryフラグがtrueのものを先に配置。- 次に
categoryNameでアルファベット順にソート。 - 最後に
titleでアルファベット順にソート。
しかし、このコードでは isPrimary に基づいて最後にソートされるため、最終的なリストは isPrimary が true の要素が先頭に来るようにソートされるが、categoryName や title に基づくソート順は保証されない。
正しい振る舞いを実現するためには、ソート条件を一度に組み合わせる必要があり、複数の条件を一つの sorted(by:) 呼び出し内で比較することで達成できる。例えば:
let sortedFlavors = flavors.sorted {
if $0.isPrimary != $1.isPrimary {
return $0.isPrimary && !$1.isPrimary
} else if $0.categoryName != $1.categoryName {
return $0.categoryName < $1.categoryName
} else {
return $0.title < $1.title
}
}